Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 18 Menü-, Symbol- und Statusleiste
  gp 18.1 Das Steuerelement »ToolStripContainer«
  gp 18.2 Bereitstellen eines Menüs
    gp 18.2.1 Die Hierarchie der Menüklassen
    gp 18.2.2 Das Erzeugen eines Menüs
    gp 18.2.3 Die Eigenschaften der Menüelemente »ToolStripMenuItem«
    gp 18.2.4 »ToolStripComboBox« und »ToolStripTextBox«
    gp 18.2.5 Ereignisse
    gp 18.2.6 Beispielprogramm
  gp 18.3 Kontextmenüs
    gp 18.3.1 Das Standardverhalten eines Kontextmenüs ändern
    gp 18.3.2 Ereignisse des Kontextmenüs
    gp 18.3.3 Das Kontextmenü einer Textbox
  gp 18.4 Die Zwischenablage
    gp 18.4.1 Speichern und Abrufen von Daten aus der Zwischenablage
    gp 18.4.2 Andere Methoden, um Daten in die Zwischenablage zu schreiben und abzurufen
    gp 18.4.3 Mehrere Datenformate in der Zwischenablage
    gp 18.4.4 Eigene Datenformate in die Zwischenablage schreiben
    gp 18.4.5 Leeren der Zwischenablage
    gp 18.4.6 Beispielprogramm – das Menü »Bearbeiten«
  gp 18.5 Die Symbolleiste
    gp 18.5.1 Die Eigenschaften der Symbolleistenschaltflächen
    gp 18.5.2 DropDown-Buttons in Symbolleisten
    gp 18.5.3 Ein Zwitter vom Typ »ToolStripSplitButton
    gp 18.5.4 Comboboxen in Symbolleisten
    gp 18.5.5 Textboxen in Symbolleisten
    gp 18.5.6 Fortschrittsbalken (ProgressBar)
    gp 18.5.7 Die Ereignisse der Symbolleiste programmieren
    gp 18.5.8 Beispiel einer komplexeren Symbolleiste
  gp 18.6 Die Statusleiste
    gp 18.6.1 Eine Statusleiste bereitstellen
    gp 18.6.2 Die in der Statusleiste integrierten Steuerelemente


Galileo Computing

18.2 Bereitstellen eines Menüs  downtop

Eines der wichtigsten Elemente eines Formulars ist das meist unterhalb der Titelleiste angeordnete Menü. Der sichtbare Teil eines Menüs wird als Hauptmenü bezeichnet. Zu ihm gehören typischerweise Menüelemente wie Datei, Bearbeiten, Extras usw. Der Klick auf ein Element des sichtbaren Hauptmenüs öffnet ein Untermenü, das auch als Popup-Menü bezeichnet wird und eine mehr oder minder große Anzahl dem Hauptmenü untergeordneter Menüelemente enthält. Jedes Unterelement kann seinerseits wieder Ausgangspunkt einer weiteren Untermenüebene sein. Sie sollten jedoch nicht zu großzügig mit der Anzahl der Ebenen sein und möglichst vier nicht überschreiten.

Ein Abkömmling des herkömmlichen Menüs ist das Kontextmenü. Während das Hauptmenü immer mit dem Formular verknüpft ist, können Kontextmenüs an Steuerelemente gebunden werden. Ein Kontextmenü wird üblicherweise mit der rechten Maustaste geöffnet – vorausgesetzt, das sich unter dem Mauszeiger befindliche Steuerelement unterstützt ein Kontextmenü. Jedes Steuerelement kann ein ganz individuelles, auf das Steuerelement abgestimmtes Kontextmenü haben.

Die Menüs der meisten Windows-Anwendungen sind sich in Struktur und Inhalt sehr ähnlich. Das hat einen guten Grund: Ein Anwender wird sich in eine neue Windows-Anwendung schneller einarbeiten können, wenn das Menü an vertrauten Positionen dieselben oder zumindest ähnliche Funktionalitäten aufweist. Beispielsweise werden alle Windows-Anwendungen – solange sie einen professionellen Charakter haben – im Hauptmenü an der äußersten linken Position das Menüelement Datei zeigen, über dessen Untermenü vielleicht ein neues Dokument angelegt oder der Inhalt des aktuellen Dokuments gespeichert bzw. ausgedruckt werden kann.


Galileo Computing

18.2.1 Die Hierarchie der Menüklassen  downtop

Wie weiter oben schon angedeutet, wurde in .NET 2.0 die altbewährte Komponente MainMenu um die neue Komponente MenuStrip ergänzt. Letztere können Sie direkt in den Clientbereich der Form ziehen, wo sie dann statisch, meist unterhalb der Titelleiste im Fenster angedockt wird. Um alle Vorzüge der Strip-Steuerelementfamilie ausnutzen zu können, empfiehlt es sich, MenuStrip in ein ToolStripContainer-Objekt einzubetten, üblicherweise auf dem oberen ToolStripPanel.

Der größte Teil aller bekannten Fenster, die wir kennen, weist im Hauptmenü nur Elemente ähnlich einer Schaltfläche auf, die beim Anklicken ein Untermenü öffnen. Mit dem Steuerelement MenuStrip kann jedes Menüelement, unabhängig davon, ob es im Haupt- oder in einem Untermenü angesiedelt ist, nun drei Darstellungsformen annehmen: die eines Menüelements, die einer Textbox und die eines Kombinationslistenfeldes. Beschrieben werden diese durch die Klassen

gp  ToolStripMenuItem
gp  ToolStripComboBox
gp  ToolStripTextBox

Die wichtigste Klasse ist zweifelsohne ToolStripMenuItem, die anderen beiden spielen bisher in herkömmlichen Anwendungen kaum mehr als eine untergeordnete Rolle. Die kommenden Ausführungen werden daher fast ausschließlich diesen Menüelementtyp voraussetzen.

Ein MenuStrip-Objekt beschreibt einen Container, in dem alle Hauptmenüelemente enthalten sind, die in einer Auflistung vom Typ ToolStripItemCollection verwaltet werden. Die Auflistung kann Objekte beinhalten, die vom Typ ToolStripItem bzw. von dieser Klasse abgeleitet sind. Dazu gehören unter anderem auch die eben erwähnten Typen ToolStripMenuItem, ToolStripComboBox und ToolStripTextBox.

Hinzugefügt werden die Menüelemente dem MenuStrip-Objekt mit der Methode Add oder AddRange, die auf die Eigenschaft Items aufgerufen werden. Items liefert die Referenz auf die Collection.


Dim newMenu As ToolStripMenuItem = _
New ToolStripMenuItem("Hilfe")
Me.menuStrip1.Items.Add(New ToolStripMenuItem("Hilfe"))

Natürlich erledigt diese Aufgabe normalerweise der Designer, aber sollten Sie eine Anwendung schreiben, die aufgrund bestimmter Rahmenbedingungen zur Laufzeit ein Hauptmenü dynamisch aufbaut, können Sie auch per Code jederzeit ein Menü erzeugen, ergänzen oder auch reduzieren. Dazu stehen Ihnen, wie in allen anderen bekannten Fällen auch, die Methoden Remove, Contains, Clear usw. zur Verfügung.

Die Auflistung enthält alle Menüelemente des Hauptmenüs. Handelt es sich um den Typ ToolStripMenuItem, kann dieser Knotenpunkt eines untergeordneten Menüs sein, das sich selbst wiederum aus mehr oder weniger vielen Menüelementen zusammensetzt.


Hinweis

Menüelemente, die vom Typ ToolStripComboBox oder ToolStripTextBox sind, können nicht Ausgangspunkt eines sich daran anschließenden Untermenüs sein.


Die einem ToolStripMenuItem-Objekt untergeordneten Menüelemente werden in einer dem ToolStripMenuItem eigenen Collection verwaltet, die ebenfalls vom Typ ToolStripItemCollection ist. Unverständlicherweise liefert aber eine anders bezeichnete Eigenschaft die Referenz auf die Auflistung: DropDownItems.


newMenu.DropDownItems.Add(New ToolStripMenuItem("1. Untermenü"))
newMenu.DropDownItems.Add(New ToolStripMenuItem("2. Untermenü"))


Galileo Computing

18.2.2 Das Erzeugen eines Menüs  downtop

Ausgangspunkt eines Menüs ist eine Instanz der Klasse MenuStrip. Das Objekt steht für das Hauptmenü einer Form, beschreibt aber selbst keine Menüeinträge, sondern ist nur ein Container, der Menüeinträge oder auch Combo- bzw. Textboxen aufnehmen kann.

Sie können sich zwischen zwei Möglichkeiten entscheiden, um ein vollständiges Menü bereitzustellen:

gp  Sie geben die Menüelemente direkt im Designer der Form an.
gp  Sie benutzen den Elementauflistungs-Editor

Sie können beide Techniken nebeneinander verwenden, da sie sich nicht gegenseitig ausschließen. Welche Sie davon bevorzugt einsetzen, hängt von Ihnen selbst ab.

Erstellen eines Menüs im Designer der Form

Am einfachsten erstellen Sie ein Menü, indem Sie aus der Toolbox ein MenuStrip-Control in die Form oder auf die gewünschte Lasche des ToolStripContainers ziehen. Im noch leeren Menü in der Form können Sie nun die Beschriftung der einzelnen Menüelemente direkt eintragen – sowohl für die Hauptmenüelemente als auch für alle Unterelemente. Wünschen Sie die Darstellung als Combo- oder Textbox, öffnen Sie über die Pfeilschaltfläche einfach zu dem neuen Element die entsprechende Auswahlliste.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.2     Auswahlliste der möglichen Menüelemente

In den meisten Anwendungen ist ein Buchstabe der Beschriftung eines Menüelements unterstrichen. Durch Drücken der (Alt)-Taste in Kombination mit der Taste, die dem unterstrichenen Zeichen entspricht, wird das Untermenü dieses Hauptmenüpunkts geöffnet. Sie erzielen dieses Navigationsverhalten, wenn Sie vor dem zu unterstreichenden Buchstaben ein »&«-Zeichen setzen. Um innerhalb des Menütextes ein »&«-Zeichen anzuzeigen, müssen im Text zwei »&«-Zeichen aufeinander folgen.


Hinweis

Sollten Sie den Unterstrich zur Laufzeit nicht sehen, liegt das möglicherweise an Ihrer System-einstellung. Diese können Sie ändern, indem Sie das Kontextmenü des Desktops öffnen, daraus Eigenschaften wählen und im geöffneten Dialog die Registerkarte Darstellung. Klicken Sie auf Effekte, und entfernen Sie dann die Markierung der Option Tastaturnavigationsanzeiger ausblenden (mit Alt-Taste einblenden).


Trennstriche innerhalb eines Untermenüs zur optischen Unterstützung und Verdeutlichung von Gruppierungen erhalten Sie durch die Eingabe eines einfachen Bindestrichs (–). In diesem Moment wandelt sich der Typ ToolStripMenuItem in den Typ ToolStripSeparator um, der im Vergleich zum erstgenannten Typ naturgemäß deutlich weniger Eigenschaften aufweist.

Sollten Sie zu einem späteren Zeitpunkt feststellen, dass die Anordnung der Menüelemente nicht optimal ist, können Sie diese mit der Maus verschieben. Nicht vergessen sollten Sie, jedem Menüelement einen beschreibenden Bezeichner im Eigenschaftsfenster zuzuweisen (Eigenschaft Name). Es ist nicht der guten Lesbarkeit des Programmcodes dienlich, wenn die vielleicht 30 verschiedenen Menüelemente ToolStripMenuItem1 bis ToolStripMenuItem30 heißen.

Erstellen eines Menüs mit dem Elementauflistungs-Editor

Um ein Menü zu erstellen, können Sie auch einen Assistenten starten. Dazu öffnen Sie über die Eigenschaft Items im Eigenschaftsfenster des MenuStrip-Objekts den Elementauflistungs-Editor, der Sie intuitiv bei der Zusammenstellung und weiteren Gestaltung des Menüs unterstützt (siehe Abbildung 18.3). Der Editor unterstützt Sie grundsätzlich nur bei der Erzeugung einer direkten Menüebene. Wollen Sie ausgehend von einem Menüelement ein Untermenü bereitstellen, klicken Sie auf die Eigenschaft DropDownItems des Menüelements – entweder im Elementauflistungs-Editor oder im Eigenschaftsfenster. Daraufhin öffnet sich ein weiteres Editorfenster, in dem Sie die nächste Menüebene definieren können.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.3     Der Elementauflistungs-Editor

Elementanordnung mit »AllowItemRecorder« ändern

Normalerweise haben alle Menüelemente eine feste Position zueinander: links außen Datei, rechts daneben Bearbeiten usw. Das ist eine Konvention, an die Sie sich auch halten sollten. Nichtsdestotrotz können Sie es auch dem Benutzer überlassen, eine ganz individuelle Anordnung festzulegen. Allerdings müssen Sie ihm das auch ausdrücklich gestatten. Dafür dient die Eigenschaft AllowItemRecorder. Diese steht zunächst auf False und verbietet dem Anwender die Neuanordnung. Stellen Sie True ein, kann der Benutzer die Menüelemente mit der Maustaste bei gleichzeitig gedrückter (Alt)-Taste an die von ihm bevorzugte Position ziehen.

Die Ausrichtung der Menüelemente im Container mit »LayoutStyle«

Kann die Größe einer Form zur Laufzeit verändert werden, könnte das dazu führen, dass die Gesamtbreite der Menüzeile die Breite der Form überschreitet. Was passiert mit den Menü-elementen, die rechts im Menü zu finden sind und keinen Platz mehr finden, um sich darzustellen? Versuchen Sie, durch einen Test die Antwort zu finden, werden Sie feststellen, dass die Menüelemente, die keinen ausreichenden Platz mehr finden, einfach nicht mehr angezeigt werden.

Müssen Sie sicherstellen, dass der Anwender auch diese Menüpunkte auswählen kann, sollten Sie sich die Eigenschaft LayoutStyle genauer ansehen. Hier lautet die Einstellung HorizontalStackWithOverflow.

LayoutStyle kann insgesamt fünf verschiedene Werte annehmen, die in der Enumeration ToolStripLayoutStyle vordefiniert sind.


Tabelle 18.1     Mitglieder der Enumeration »ToolStripLayoutStyle«

ToolStripLayoutStyle-Member  
Flow Gibt an, dass Elemente nach Bedarf horizontal oder vertikal fließen.
HorizontalStackWithOverflow Gibt an, dass Elemente horizontal angeordnet werden und unter Umständen. überlaufen.
StackWithOverflow Gibt an, dass Elemente automatisch angeordnet werden.
Table Gibt an, dass Elemente linksbündig angeordnet werden.
VerticalStackWithOverflow Gibt an, dass Elemente vertikal angeordnet sind, innerhalb des Steuerelements zentriert werden und unter Umständen überlaufen.

Table und VerticalStackWithOverflow sind sehr ungewöhnlich und kommen wohl kaum in Betracht. StackWithOverflow lässt sich überhaupt nicht einstellen, stattdessen springt die Anzeige immer auf HorizontalStackWithOverflow zurück.

Zurück zur Problematik des Überlaufs der Menüelemente. Dies können Sie mit der Einstellung Flow vermeiden. Die Menüelemente, die von Hause aus nicht mehr in eine Menüzeile passen, werden in eine zweite, neu eröffnete geschoben und stehen dem Anwender damit jederzeit zur Verfügung. In Abbildung 18.4 sehen Sie den Unterschied zwischen HorizontalStackWithOverflow und Flow.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.4     Auswirkung der Einstellung der Eigenschaft »LayoutStyle«

Die Menüleiste an einer anderen Seite der Form andocken

Normalerweise werden Menüleisten immer oben in der Form angezeigt. Einige Programme gestatten es dem Anwender, das linke Ende der Menüleiste mit der Maus zu greifen und diese an einer anderen Seite der Form anzudocken. Dieses Feature steht auch Ihnen zur Verfügung. Sie müssen dazu nur die Eigenschaft GripStyle des MenuStrips auf Visible stellen, der Standard ist Hidden. Es werden dann drei Punkte am linken Rand angezeigt, die als Ausgangspunkt der Operation dienen.

Eine Bedingung wird aber dabei an eine verschiebbare Menüleiste gestellt: Sie muss sich in einem ToolStripContainer befinden, denn nur dieser Container ist in der Lage, das Steuer-element neu auszurichten.

Einen Nebeneffekt hat dabei jedoch die Einstellung der vorher besprochenen Eigenschaft LayoutStyle. Haben Sie diese nämlich auf Flow eingestellt, hat die Einstellung von GripStyle keine Auswirkungen: Die Ziehpunkte werden nicht angezeigt, und die Menüleiste ist nicht verschiebbar.


Galileo Computing

18.2.3 Die Eigenschaften der Menüelemente »ToolStripMenuItem«  downtop

Wenden wir uns nun den Eigenschaften der ToolStripMenuItem-Objekte zu, die übliche Menüelemente beschreiben.

Beschriftung

Die Beschriftung eines Menüelements wird durch die Eigenschaft Text festegelegt. Sie können die Beschriftung auch zur Laufzeit ändern, z.  B.:


menuNeu.Text = "Neu"

Shortcuts

Weiter oben habe ich bereits erwähnt, dass für ein Menüelement mit dem »&«-Zeichen ein Tastenkürzel festgelegt werden kann, mit dem das dem Menüelement zugeordnete Untermenü geöffnet wird. Zusätzlich zum Tastenkürzel in Verbindung mit der (Alt)-Taste kann ein Menüelement auch über eine vordefinierte Tastenkombination angesteuert werden, die in der Eigenschaft ShortcutKeys festgelegt wird.

Das im Framework 1.0/1.1 bereitgestellte Objekt MenuItem war in Bezug auf das Einstellen einer Tastenkombination ziemlich eingeschränkt, da nur bestimmte Kombinationen zugelassen waren, die in einer Enumeration definiert waren. ToolStripMenuItem hingegen lässt praktisch keine Vorstellung mehr unerfüllt. Sobald Sie die Pfeilschaltfläche in der Wertespalte der Eigenschaft ShortcutKeys anklicken, öffnet sich ein Hilfsfenster, in dem Sie die gewünschte Tastenkombination festlegen können (siehe Abbildung 18.5).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.5     Hilfsfenster zur Festlegung eines Shortcuts

In der Auswahlliste Taste finden Sie nun auch Tasten aufgeführt, die bisher zur Bildung einer Tastenkombination nicht im Repertoire waren, darunter auch einige ziemlich exotisch anmutende. Diese werden in der Enumeration System.Windows.Forms.Keys beschrieben, der das Flags-Attribut angeheftet ist. Durch bitweise Verknüpfung können Sie deshalb auch ohne Unterstützung des Visual Studios die von Ihnen bevorzugte Tastenkombination per Code festlegen, z.  B. (Strg) + (Shift) + (A) mit


Me.menuItem.ShortcutKeys = Keys.Control Or Keys.Shift Or Keys.A

Standardmäßig wird die mit dem Menüelement verknüpfte Tastenkombination rechts neben der Menübeschriftung angezeigt. Diese Vorgabe kann mit der Eigenschaft ShortcutKeyDisplayString umgangen werden, indem Sie hier einfach die Zeichenfolge eintragen, die Sie dem Anwender anbieten wollen. Die Zeichenfolge wird auch dann angezeigt, wenn Sie dem Menüelement keinen Shortcut zugewiesen haben.

Falls Sie die Tastenkürzel nicht anzeigen wollen, können Sie die Eigenschaft ShowShortcutKeys abweichend von der Standardvorgabe auf False einstellen. Das müssen Sie gegebenenfalls für jeden Menüpunkt machen, denn eine übergeordnete Eigenschaft, die sich auf das gesamte Menü auswirkt, gibt es in dieser .NET-Version noch nicht.


Anmerkung

In Windows-Anwendungen haben sich bestimmte Tastenkombinationen für bestimmte Aktionen fest etabliert. Beispielsweise wird ein neues Dokument meist mit (Strg) + (N) geöffnet, gespeichert wird mit (Strg) + (S). Sie sollten sich, wenn möglich, an diese Konventionen halten, um den Anwendern, die es gewohnt sind, mit Tastenkombinationen zu arbeiten, die Einarbeitung in eine Anwendung zu erleichtern.


Die Sichtbarkeit

Mit der Eigenschaft Visible und deren Einstellung False kann ein Menüelement unsichtbar gemacht werden. Bemerkenswert ist dabei die Wechselwirkung zwischen Visible und der Eigenschaft ShortcutKeys. Selbst dann, wenn ein Menüelement, dem eine Tastenkombination zugewiesen wird, mit Visible=False ausgeblendet wird, reagiert die Tastenkombination und führt den mit dem Click-Ereignis verknüpften Ereignishandler aus. Eine herrliche Spielwiese zur Implementierung undokumentierter Funktionalitäten.

Der Aktivierungszustand

Die Wirkungsweise der Eigenschaft Enabled ähnelt der von Visible nur auf den ersten Blick. Während Visible das betreffende Menüelement ausblendet, wird es mit Enabled=False deaktiviert, d.  h., es wird abgeblendet und kann nicht ausgewählt werden. Der wesentliche Unterschied ist hierbei, dass ein deaktiviertes Menüelement auch nicht auf die ihm über ShortcutKeys zugewiesene Tastenkombination reagiert.

Die Markierung

Menüelemente, die mit einem Häkchen versehen sind, verdeutlichen, ob die durch den Menüpunkt beschriebene Option gesetzt ist oder nicht. Diese Menüelemente bieten eine Auswahlmöglichkeit, die vergleichbar mit der einer Checkbox ist, sie arbeiten also wie ein »Ein-/Aus-Schalter«.

Voraussetzung dafür, dieses Verhalten einem Menüelement eigen zu machen, ist die Eigenschaft CheckedOnClick, die auf True gesetzt werden muss. Zur Laufzeit wird das Menüelement dann mit einem Häkchen versehen, wenn vor dem Anklicken kein Häkchen gesetzt war, und umgekehrt. Das Markieren eines Menüelements mit einem Häkchen wird von der Eigenschaft Checked gesteuert. Legen Sie Checked=True fest, wird das Häkchen angezeigt.

ToolStripMenuItem bietet keine direkte Möglichkeit, anstelle des Häkchens einen ausgefüllten Kreis zu setzen, der, ähnlich wie eine Gruppe von Radiobuttons, signalisiert, dass nur eine von mehreren angebotenen Auswahloptionen ausgewählt werden kann. Können oder wollen Sie auf ein solches Feature nicht verzichten, haben Sie drei Alternativen:

gp  Sie blenden ein Image im ToolStripMenuItem ein bzw. aus.
gp  Sie machen sich die Eigenschaft CheckState des Menüelements zunutze.
gp  Die Eigenschaft CheckState kennt drei Einstellungen, die in der gleichnamigen Enumeration vordefiniert sind: CheckState.Checked, CheckState.Unchecked und CheckState.Indeterminate. Letztere dient eigentlich dazu, einen nicht eindeutigen Zustand anzuzeigen, lässt sich aber durchaus auch für unser Vorhaben gebrauchen, denn zur Laufzeit wird zwar kein ausgefüllter Kreis, aber zumindest ein auf der Spitze stehendes Quadrat angezeigt.

Wenn Sie auf diese Weise einen Radiobutton-Effekt simulieren wollen, sollten Sie die Eigenschaft CheckOnClick=False einstellen. Im Click-Ereignis des Menüelements müssen Sie dann dafür sorgen, dass je nach Ausgangszustand zwischen CheckState.Unchecked und CheckState.Indeterminate umgeschaltet wird. Im folgenden Codefragment wird das gezeigt.


Private Sub mnuRadio_Click(...) Handles mnuRadio.Click
If (mnuRadio.CheckState = CheckState.Indeterminate) Then
mnuRadio.CheckState = CheckState.Unchecked
ElseIf (mnuRadio.CheckState = CheckState.Unchecked) Then
mnuRadio.CheckState = CheckState.Indeterminate
End If
End Sub

Die Wechselwirkung zwischen mehreren Menüelementen, die eine Gruppe bilden, aus der nur ein Menüelement markiert sein darf, müssen Sie natürlich selbst codieren.

Die Darstellung eines Menüelements verändern

Zu den optisch vorteilhaftesten Neuerungen der Menüelemente gehört die Anzeige eines Bildchens am linken Rand des Menüelements, die sich in den Menüs aller neueren Windows-Anwendungen etabliert haben. Zwar kann in einem MenuItem-Element ebenfalls ein Bildchen angezeigt werden (zur Erinnerung: das ist der Typ des Menüelements, der zu dem in die Tage gekommenen MainMenu aus .NET Framework 1.0/1.1 gehört), nur war diese Fähigkeit kein elementares Feature dieses Objekts, sondern bedurfte bisher für jedes einzelne Menüelement einen nicht unerheblichen Programmieraufwand. Ansonsten blieb nur noch die Alternative, das Steuerelement eines Drittanbieters einzusetzen. Die Klasse ToolStripMenuItem macht jetzt die Gestaltung eines Menüelements zu einem Kinderspiel.

Um ein Menüelement mit einem Symbol auszustatten, öffnen Sie über das Eigenschaftsfenster der Eigenschaft Image den Dialog Ressource auswählen. Importieren Sie hier das Symbol, das Sie dem Menüelement zuordnen möchten. Hier haben Sie zwei Möglichkeiten:

gp  Sie wählen Lokale Ressource aus.
gp  Sie entscheiden sich für Projektressourcendatei.

Welche Konsequenzen die Entscheidung für die eine oder andere Alternative hat, werde ich Ihnen am Ende des Buches in Kapitel 28 erläutern. Aber um es an dieser Stelle gleich vorwegzunehmen: Markieren Sie hier sinnvollerweise die lokale Ressource.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.6     Das Dialogfenster »Ressource auswählen«

Unter Umständen sollten Sie unter ImageTransparentColor eine Farbe angeben, die Transparenz zulässt, so die Hintergrundfarbe des Symbols keinen unansehnlichen Effekt im Menü hinterlässt.

Wenn Sie wollen, stehen Ihnen über ein Bildchen hinaus weitere Möglichkeiten offen, jedes Menüelement individuell zu gestalten. Mit DisplayStyle können Sie festlegen, ob Sie sowohl das Symbol als auch den Text, nur das Symbol bzw. Text oder keines der beiden Elemente angezeigt bekommen wollen.

Tatsächlich lässt sich nun endlich in den Menüelementen auch die Schriftdarstellung mit der Eigenschaft Font problemlos beliebig anpassen. Sie können die Hintergrund- oder auch Schriftfarbe mit BackColor und ForeColor beeinflussen und zu guter Letzt auch mit BackgroundImage ein Hintergrundbildchen einbauen und dessen Darstellung mit Background-ImageLayout innerhalb des Menüpunkts nach Belieben festlegen.


Galileo Computing

18.2.4 »ToolStripComboBox« und »ToolStripTextBox«  downtop

In einer Menüleiste eine Textbox oder ein Kombinationslistenfeld zu integrieren, ist ein neues Feature des .NET Frameworks 2.0. An dieser Stelle auf die Eigenschaften und Verhaltensweisen einzugehen, erübrigt sich, denn die beiden Steuerelemente unterscheiden sich nur geringfügig von denen, die Sie einer WinForm hinzufügen.


Galileo Computing

18.2.5 Ereignisse  downtop

Wenn Sie schon mit dem .NET Framework 1.0/1.1 gearbeitet haben, werden Sie sicherlich hocherfreut darüber sein, mit welchen neuen Möglichkeiten die Gestaltung eines Menüs ausgestattet ist. Viele neue Eigenschaften ermöglichen es Ihnen, weitaus individueller ein Menü zu designen, als es bisher der Fall war. Dieser Zuwachs macht sich auch bei den Ereignissen bemerkbar, denn wie bei allen anderen Steuerelementen auch löst das Ändern diverser Eigenschaften zur Laufzeit ein Ereignis aus.

Unter den vielen Ereignissen ist aber eigentlich nur ein Ereignis wichtig, nämlich Click. Dieses wird ausgelöst, wenn der Benutzer einen Menüpunkt anklickt. Enthält der Menüpunkt Unterpunkte, kommt es zu einer Ereigniskette:

gp  DropDownOpening wird ausgelöst, wenn die Maus über einen Menüpunkt gezogen wird, der weitere Unterpunkte besitzt. Bei Auslösung des Ereignisses ist das Untermenü noch nicht geöffnet.
gp  DropDownOpened wird ausgelöst, nachdem sich das Untermenü geöffnet hat.

Klickt der Anwender auf ein Element des Untermenüs, tritt zuerst DropDownItemClicked des übergeordneten Menüelements auf, bevor das Click-Ereignis des ausgewählten Menüelements endgültig dafür sorgt, dass die Anwendung das vom Benutzer gewünschte Verhalten zeigt.

ToolStripMenuItem-Objekte können auch per Doppelklick aktiviert werden. Dazu muss die Eigenschaft DoubleClickEnabled=True gesetzt werden. Allerdings wirkt sich ein Doppelklick nur auf die Elemente im Hauptmenü aus, da alle anderen Menüelemente schon nach dem Empfang des ersten Mausklicks geschlossen werden und einen Doppelklick nicht mehr verarbeiten können.

Alle Menüelemente reagieren auch auf alle Mausereignisse wie beispielsweise MouseMove, MouseDown und MouseUp. Wann diese Ereignisse ausgelöst und wie sie sinnvoll eingesetzt werden, erfahren Sie in einem späteren Kapitel.

Das folgende Programmbeispiel zeigt den Einsatz des Ereignisses DropDownOpening. Im Ereignishandler wird geprüft, ob sich in der Zwischenablage textuelle Daten befinden. Ist das Ergebnis der Prüfung positiv, wird das Untermenü Einfügen aktiviert angezeigt, ansonsten ist es deaktiviert. Der Anwender kann zur Laufzeit auf Einfügen klicken mit der Folge, dass eine Textbox den Inhalt der Zwischenablage anzeigt.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 18\DropDownOpeningDemo
' ----------------------------------------------------------
Public Class Form1
Private Sub mnuEinfuegen_DropDownOpening(...) _
Handles mnuEinfuegen.DropDownOpening
' Prüfen, ob die Zwischenablage textuelle Daten enthält
If (Clipboard.GetDataObject(). _
GetDataPresent(DataFormats.Text)) Then
mnuEinfuegen.Enabled = True
Else
mnuEinfuegen.Enabled = False
End If
End Sub
Private Sub mnuEinfuegen_Click(...) _
Handles mnuEinfuegen.Click
Dim myData As IDataObject = Clipboard.GetDataObject()
txtClipboxContent.Text = myData.GetData(GetType(String))
End Sub
End Class

Mit der Klasse Clipboard, die Methoden bereitstellt, um mit der Zwischenablage Daten auszutauschen, werden wir uns weiter unten im Abschnitt 18.4 noch intensiver beschäftigen.


Galileo Computing

18.2.6 Beispielprogramm  toptop

Im folgenden Beispiel enthält die Form zwei Textboxen, die durch ein Splitter-Steuerelement voneinander getrennt sind. Ein Splitter dient dazu, einen Clientbereich in mehrere einzelne, voneinander unabhängige Bereiche aufzuteilen. Die Teilbereiche werden meist von Steuerelementen vollständig beansprucht (Einstellung Dock=Fill). Zur Laufzeit kann der Benutzer mit der Maus den Splitter greifen und nach eigenem Ermessen die Teilbereiche verkleinern oder vergrößern, ähnlich wie im Windows-Explorer.

Das Hauptmenü hat die drei Menüpunkte Datei, Bearbeiten und Optionen nebst den wichtigsten Untermenüelementen. Optionen hat nur einen Untermenüpunkt (Hintergrundfarbe), der selbst eine weitere Untermenüebene hat. In dieser werden vier Menüelemente angezeigt, aus denen der Benutzer die gewünschte Hintergrundfarbe der beiden Textboxen auswählen kann. Die aktuelle Hintergrundfarbe ist mit einem Häkchen versehen.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 18.7     Das Fenster des Beispiels »MenuStripDemo«

In diesem Beispiel sind bereits die Untermenüelemente von Bearbeiten enthalten, jedoch noch ohne Programmcode. Dazu muss ich Ihnen zuerst noch die Programmierung der Zwischenablage weiter unten in diesem Kapitel vorstellen. Die Anwendung ist jedoch bereits in der Lage, Dateien in der oberen Textbox zu öffnen, diese zu bearbeiten und anschließend auf einfache Weise zu speichern. Außerdem wird gezeigt, wie Sie die Unterelemente von Hintergrundfarbe codieren können.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 18\MenuStripDemo
' ----------------------------------------------------------
Imports System.IO
Public Class Form1
' Ereignishandler der Click-Ereignisse der Menüelemente, mit denen
' die Hintergrundfarben der Textboxen geändert wird
Private Sub ChangeColor(...) Handles mnuWeiß.Click, _
mnuRot.Click, mnuGelb.Click, mnuBlau.Click
For Each temp As ToolStripMenuItem _
In mnuHintergrundfarbe.DropDownItems
temp.Checked = False
Next
Select Case sender.Text
Case "Weiß"
txtOben.BackColor = Color.White
txtUnten.BackColor = Color.White
mnuWeiß.Checked = True
Case "Rot"
txtOben.BackColor = Color.Red
txtUnten.BackColor = Color.Red
mnuRot.Checked = True
Case "Gelb"
txtOben.BackColor = Color.Yellow
txtUnten.BackColor = Color.Yellow
mnuGelb.Checked = True
Case "Blau"
txtOben.BackColor = Color.Blue
txtUnten.BackColor = Color.Blue
mnuBlau.Checked = True
End Select
End Sub
' Menü "Neu" leert beide Textboxen
Private Sub mnuNeu_Click(...) Handles mnuNeu.Click
Me.txtOben.Text = ""
Me.txtUnten.Text = ""
End Sub
' eine vorhandene Datei öffnen
Private Sub mnuOeffnen_Click(...) Handles mnuOeffnen.Click
OpenFileDialog1.Filter = _
"Text-Dateien (.txt)|*.txt|Alle Dateien (*.*)|*.*"
Dim result As DialogResult = _
OpenFileDialog1.ShowDialog()
Try
If result = Windows.Forms.DialogResult.OK Then
Dim sr As StreamReader = _
New StreamReader(OpenFileDialog1.FileName)
txtOben.Text = sr.ReadToEnd()
sr.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Texteditor")
End Try
End Sub
' den Inhalt der oberen Textbox speichern
Private Sub mnuSpeichernUnter_Click(...) _
Handles mnuSpeichernUnter.Click
Dim result As DialogResult = _
SaveFileDialog1.ShowDialog()
Try
If (result = Windows.Forms.DialogResult.OK) Then
Dim sw As StreamWriter = _
New StreamWriter(SaveFileDialog1.FileName, False)
sw.Write(txtOben.Text)
sw.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub mnuBeenden_Click(...) Handles mnuBeenden.Click
Application.Exit()
End Sub
End Class

Auf den Code zum Öffnen und Speichern einer Datei in den jeweiligen Ereignishandlern der entsprechenden Menüelemente gehe ich an dieser Stelle nicht ein. Sie können das im Bedarfsfall in Kapitel 17 nachlesen. Sehen wir uns vielmehr die Methode ChangeColor an, die als gemeinsamer Ereignishandler für alle Click-Ereignisse der Untermenüelemente von Hintergrundfarbe dient. Die Verknüpfung wurde im Eigenschaftsfenster vorgenommen.

Zuerst wird in einer For Each-Schleife die Auflistung der farbgebenden Menüebene durchlaufen. Die Referenz auf die Auflistung liefert die Eigenschaft DropDownItems des Objekts menuHintergrundfarbe.


For Each temp As ToolStripMenuItem _
In mnuHintergrundfarbe.DropDownItems
temp.Checked = False
Next

Der Zustand Checked jedes Menüelements wird in der Schleife auf False gesetzt. Das ist schneller und einfacher, als jedes Element dahingehend zu untersuchen, ob das Häkchen gesetzt ist oder nicht.

Je nach Wahl des Anwenders muss nun die Hintergrundfarbe der Textboxen angepasst und das dazugehörige Menüelement markiert werden.

Nun muss aus dem Reigen der denkbaren Ereignisauslöser der konkrete ermittelt werden. Es bietet sich dazu an, die Eigenschaft Text auszuwerten. Das Ergebnis der Untersuchung wird einer Select Case-Anweisung als Ausdruck übergeben.


Select Case sender.Text

In den Case-Zweigen wird anschließend die Hintergrundfarbe passend gesetzt und das dafür zuständige Menüelement mit einem Häkchen versehen.

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de